로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지,웹·앱 개발의 모든것을 담아낸 강의와 개발 노트
16 django filter와 DRF를 이용한 API 필터링 | ✅ 편저: 코담 운영자
16-django-filter와 DRF를 이용한 API 필터링
- django-filter와 DRF를 이용한 API 필터링🔗 소스 1: bugbytes-io/drf-course-api
🔗 소스 2: braverokmc79/Django_REST_Framework_Series
1. 개요
이번 강의에서는 Django REST Framework(DRF)에서 django-filter
패키지를 활용해 API 응답 데이터를 필터링하는 방법을 배웁니다. 대량의 데이터를 클라이언트가 직접 걸러내는 대신, 서버에서 원하는 조건의 데이터만 응답해주는 방식으로 API 성능을 높이고, 사용 편의성을 개선할 수 있습니다.
2. 기본 필터링 기능
- API에서 기본적으로 전체 데이터를 반환하는 것이 일반적이지만, 클라이언트가 필요한 일부 데이터만 조회할 수 있도록 필터 기능이 필요합니다.
- 예: 가격이 특정 값 이상/이하인 상품만 조회, 이름에 특정 단어가 포함된 상품만 필터링
3. django-filter 설치 및 설정
pip install django-filter
settings.py
설정:
INSTALLED_APPS = [
...
'django_filters',
]
REST_FRAMEWORK = {
...
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}
예 - 자동 필터 처리
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filterset_fields = ['category', 'price']
---
/api/products/?category=book
/api/products/?price=5000
📝 정리
설정 항목 | 설명 |
---|---|
'DEFAULT_FILTER_BACKENDS' |
필터 처리를 어떤 방식으로 할지 정하는 설정 |
'django_filters.rest_framework.DjangoFilterBackend' |
django-filter를 사용한 강력하고 직관적인 필터링 지원 |
4. View에 filterset 설정 (기초형)
class ProductListCreateAPIView(generics.ListCreateAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filterset_fields = ('name', 'price')
- 기본은
exact
조건으로만 필터링됨 - 예:
GET /products/?name=TV
또는?price=300.00
5. 고급 필터링: FilterSet 클래스 사용
filters.py
파일 생성 후 아래처럼 작성:
import django_filters
from api.models import Product
class ProductFilter(django_filters.FilterSet):
class Meta:
model = Product
fields = {
'name': ['exact', 'icontains'],
'price': ['exact', 'lt', 'gt', 'range'],
}
exact
: 정확히 일치icontains
: 대소문자 구분 없이 포함lt
,gt
: 작다/크다range
: 범위 조회 (예:?price__range=100,500
)
View에서 설정:
from api.filters import ProductFilter
class ProductListCreateAPIView(generics.ListCreateAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
#filterset_fields = ('name', 'price')
filterset_class = ProductFilter
def get_permissions(self):
self.permission_classes = [AllowAny]
if self.request.method == 'POST':
self.permission_classes = [IsAdminUser]
return super().get_permissions()
6. 다양한 필터 예시 (쿼리 파라미터)
/products/?name__icontains=tv
/products/?price__gt=100
/products/?price__lt=500
/products/?price__range=100,300
7. 필터링의 이점
- 클라이언트 불필요한 데이터 처리 감소
- 네트워크 트래픽 감소
- 서버 응답 시간 단축
8. 정리
django-filter
를 통해 DRF에서 손쉽게 필터링 기능을 추가할 수 있음- 간단한 필터링은
filterset_fields
, 고급 필터링은FilterSet
클래스 활용 - API 응답 최적화 및 사용자 편의성 향상에 매우 효과적
다음 강의에서는 DRF의 검색(SearchFilter)과 정렬(OrderingFilter) 기능을 활용하는 방법을 알아봅니다.